package com.obelisco.modelo.data.auxiliares;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.sql.Blob;
import java.sql.SQLException;
import org.hibernate.Hibernate;
import org.hibernate.validator.ClassValidator;

import com.obelisco.modelo.data.DataGenerica;

//import ucla.cumlaude.modelo.data.EstudiantePlanEstudio;
//import javax.activation.DataHandler;
//import javax.activation.*;
//import javax.mail.internet.MimePartDataSource;
import java.io.ByteArrayInputStream;
//import javax.mail.internet.MimeBodyPart;
import java.io.File;
import java.io.FileInputStream;

public class Archivo {

  private byte[] contenido = new byte[] {};
  private String nombre = "";
  private String tipo = "";

  public Archivo() {
  }

  public Archivo(File archivo) {
    try {
      byte[] bytes = Archivo.toByteArray(archivo);
      this.contenido = bytes;
      this.nombre = archivo.getName();
      this.tipo = Archivo.determinarTipo(archivo);
    } catch (Exception ex) {
      // Seguramente un Error de Entrada y Salida
    }
  }

  public byte[] getContenido() {
    return contenido;
  }

  public void setContenido(byte[] contenido) {
    this.contenido = contenido;
  }

  public String getNombre() {
    return nombre;
  }

  public String getTipo() {
    return tipo;
  }

  public void setNombre(String nombre) {
    this.nombre = nombre;
  }

  public void setTipo(String tipo) {
    this.tipo = tipo;
  }

  /** Don't invoke this.  Used by Hibernate only. */
  public void setBlob(Blob blob) {
    this.contenido = this.toByteArray(blob);
  }

  public Blob getBlob() {
    return Hibernate.createBlob(this.contenido);
  }

  public  String determinarNombreArchivo() {
	    String t = "";
/*
	    try {
	      ByteArrayInputStream inputStream = new ByteArrayInputStream(this.contenido);
	      MimeBodyPart bodyPart = new MimeBodyPart(inputStream);
	     DataSource source = new MimePartDataSource(bodyPart);
	      DataHandler dh = new DataHandler(source);
	      t = bodyPart.getFileName();
	    }
	    catch (Exception ex) {
	      // Capturar el Tipo de la Foto es importante pero no necesaria, el manejo de la exception
	      // no tiene trascendencia
	    }
*/
	    return t;
	  }

public  String determinarTipo() {
    String t = "";

//    try {
//      ByteArrayInputStream inputStream = new ByteArrayInputStream(this.contenido);
//      MimeBodyPart bodyPart = new MimeBodyPart(inputStream);
//      /*DataSource source = new MimePartDataSource(bodyPart);
//      DataHandler dh = new DataHandler(source);*/
//      t = bodyPart.getContentType();
//    }
//    catch (Exception ex) {
//      // Capturar el Tipo de la Foto es importante pero no necesaria, el manejo de la exception
//      // no tiene trascendencia
//    }

    return t;
  }

	public  static String determinarTipo(byte[] contenido) {
	    String t = "";
	
//	    try {
//	      ByteArrayInputStream inputStream = new ByteArrayInputStream(contenido);
//	      MimeBodyPart bodyPart = new MimeBodyPart(inputStream);
//	      /*DataSource source = new MimePartDataSource(bodyPart);
//	      DataHandler dh = new DataHandler(source);*/
//	      t = bodyPart.getContentType();
//	    }
//	    catch (Exception ex) {
//	      // Capturar el Tipo de la Foto es importante pero no necesaria, el manejo de la exception
//	      // no tiene trascendencia
//	    }
	
	    return t;
  }

  public static String determinarTipo(File archivo) {
    String t = "";

   /* try {
      DataSource source = new FileDataSource(archivo);
      DataHandler dh = new DataHandler(source);
      t = dh.getContentType();
    }
    catch (Exception ex) {
      // Capturar el Tipo de la Foto es importante pero no necesaria, el manejo de la exception
      // no tiene trascendencia
    }*/

    return t;
  }


  public static byte[] toByteArray(Blob fromBlob) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
      return toByteArrayImpl(fromBlob, baos);
    }
    catch (SQLException e) {
      throw new RuntimeException(e);
    }
    catch (IOException e) {
      throw new RuntimeException(e);
    }
    finally {
      if (baos != null) {
        try {
          baos.close();
        }
        catch (IOException ex) {}
      }
    }
  }

  private static byte[] toByteArrayImpl(Blob fromBlob,
                                        ByteArrayOutputStream baos) throws
      SQLException, IOException {
    byte[] buf = new byte[4000];
    InputStream is = fromBlob.getBinaryStream();
    try {
      for (; ; ) {
        int dataSize = is.read(buf);
        if (dataSize == -1) {
          break;
        }
        baos.write(buf, 0, dataSize);
      }
    }
    finally {
      if (is != null) {
        try {
          is.close();
        }
        catch (IOException
               ex) {}
      }
    }
    return baos.toByteArray();
  }
/*
  private static byte[] toByteArray(InputStream is) throws
      SQLException, IOException {

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    byte[] buf = new byte[4000];
    try {
      for (; ; ) {
        int dataSize = is.read(buf);
        if (dataSize == -1) {
          break;
        }
        baos.write(buf, 0, dataSize);
      }
    }
    finally {
      if (is != null) {
        try {
          is.close();
        }
        catch (IOException
               ex) {}
      }
    }
    return baos.toByteArray();
  }
*/


  public static byte[] toByteArray(File archivo) throws IOException {

    FileInputStream fileInput = new FileInputStream(archivo);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    byte[] buf = new byte[4000];
    InputStream is = fileInput;
    try {
      for (; ; ) {
        int dataSize = is.read(buf);
        if (dataSize == -1) {
          break;
        }
        baos.write(buf, 0, dataSize);
      }
    }
    finally {
      if (is != null) {
        try {
          is.close();
        }
        catch (IOException
               ex) {}
      }
    }

    return baos.toByteArray();
  }


}
